﻿/*
 * This file is part of MonoSettlers.
 *
 * Copyright (C) 2010-2011 Christoph Husse
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as
 *  published by the Free Software Foundation, either version 3 of the
 *  License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors: 
 *      # Christoph Husse
 * 
 * Also checkout our homepage: http://opensettlers.codeplex.com/
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace MonoSettlers
{
    public interface IRenderableVisual
    {
        IPositionTracker PositionTracker { get; set; }
        Double Width { get; set; }
        Double Height { get; set; }
        bool IsVisible { get; set; }
    }

    public delegate void DOnSelectionChanged();

    public interface ISelectionModel
    {
        IRenderSystem Parent { get; }
        IEnumerable<IMovable> Movables { get; }
        event DOnSelectionChanged OnChange;
    }

    public interface IRenderSystem : IDisposable
    {
        ISelectionModel Selection { get; }

        Point MouseXY { get; }
        Point ScreenXY { get; set; }
        int MapSize { get; }
        IEnumerable<int> MouseState { get; }
        IEnumerable<int> KeyboardState { get; }

        event DNotifyHandler<IRenderSystem> OnScreenMove;

        event DNotifyHandler<IRenderSystem, int> OnMouseDown;
        event DNotifyHandler<IRenderSystem, int> OnMouseUp;
        event DNotifyHandler<IRenderSystem> OnMouseDrag;

        event DNotifyHandler<IRenderSystem, int> OnKeyDown;
        event DNotifyHandler<IRenderSystem, int> OnKeyUp;
        event DNotifyHandler<IRenderSystem> OnKeyRepeat;

        IRenderableVisual CreateOrientedAnimation(String inAnimClass, IPositionTracker inPositionTracker, Double inWidth);

        IRenderableVisual CreateAnimation(String inAnimClass, IPositionTracker inPositionTracker, Double inWidth);

        void RemoveVisual(IRenderableVisual inVisual);

        void WaitForTermination();

        Bitmap LoadAmbientSnapshot(String inAnimClass);

        void ShowBuildingGrid(Func<Point, int> inLevelFunc);
        void HideBuildingGrid();

        /// <summary>
        /// A graphic context for the entire game screen. This static overlay is intended for UI rendering.
        /// </summary>
        Graphics UISurface { get; }

        //Bitmap Screenshot();
    }
}
